/**
 * 支付订单数据访问层 - 支付订单的数据库操作接口
 *
 * 开发人员：陈宏伟
 * 开发时间：2025-10-25 至 2025-10-30
 * 模块职责：定义支付订单的数据库查询方法，支持多租户数据隔离和复杂统计查询
 *
 * 技术要点：
 * - Spring Data JPA查询方法定义
 * - 多租户数据隔离查询设计
 * - 复杂统计查询和聚合操作
 * - 索引优化和查询性能考虑
 * - 自定义JPQL查询处理复杂业务逻辑
 *
 * 开发故事：负责支付订单Repository的设计和实现，与支付服务层深度配合，提供高效的数据访问能力和统计分析支持。
 */
package com.pbl.repository;

import com.pbl.common.enums.PaymentStatus;
import com.pbl.entity.PaymentOrder;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 支付订单数据访问接口 - 提供支付订单的CRUD操作和统计查询功能
 */
public interface PaymentOrderRepository extends JpaRepository<PaymentOrder, Long> {
    /**
     * 商户订单号查询
     */
    Optional<PaymentOrder> findByOutTradeNo(String outTradeNo);

    /**
     * 平台交易号查询
     */
    Optional<PaymentOrder> findByTradeNo(String tradeNo);

    /**
     * 企业订单列表（按创建时间倒序）
     */
    List<PaymentOrder> findByEnterprise_IdOrderByCreatedAtDesc(Long enterpriseId);

    /**
     * 企业指定状态订单列表（按创建时间倒序）
     */
    List<PaymentOrder> findByEnterprise_IdAndStatusOrderByCreatedAtDesc(Long enterpriseId, PaymentStatus status);

    /**
     * 某时段企业下指定状态订单数量
     */
    long countByEnterprise_IdAndStatusAndCreatedAtBetween(Long enterpriseId, PaymentStatus status, LocalDateTime start, LocalDateTime end);

    /**
     * 某时段企业下订单总量
     */
    long countByEnterprise_IdAndCreatedAtBetween(Long enterpriseId, LocalDateTime start, LocalDateTime end);

    /**
     * 某时段企业下成功金额汇总
     */
    @Query("select coalesce(sum(p.amount), 0) from PaymentOrder p where p.enterprise.id = ?1 and p.status = 'SUCCESS' and p.createdAt between ?2 and ?3")
    BigDecimal sumSuccessAmountBetween(Long enterpriseId, LocalDateTime start, LocalDateTime end);

    /**
     * 企业订单列表（按创建时间倒序）- 使用自定义查询避免类型转换问题
     */
    @Query("SELECT p FROM PaymentOrder p WHERE p.enterprise.id = ?1 ORDER BY p.createdAt DESC")
    List<PaymentOrder> findByEnterpriseId(Long enterpriseId);

    /**
     * 企业指定状态订单列表（按创建时间倒序）- 使用自定义查询避免类型转换问题
     */
    @Query("SELECT p FROM PaymentOrder p WHERE p.enterprise.id = ?1 AND p.status = ?2 ORDER BY p.createdAt DESC")
    List<PaymentOrder> findByEnterpriseIdAndStatus(Long enterpriseId, String status);
}
